use std::{collections::HashMap, sync::Arc};

use async_trait::async_trait;
use mf_core::{
    config::ForgeConfig,
    event::{Event, EventHandler},
    middleware::MiddlewareStack,
    types::Extensions,
};
use price_rules::loader::RulesLoaderExt;

use super::{BootstrapContext, BootstrapResult, ProjectProfile};

/// 节点/Extension 提供器
#[async_trait]
pub trait ExtensionProvider: Send + Sync {
    /// 根据项目画像返回 ModuForge 扩展定义
    async fn provide(
        &self,
        profile: &ProjectProfile,
    ) -> BootstrapResult<Vec<Extensions>>;

    /// 供日志和调试使用的名称
    fn name(&self) -> &'static str {
        "schema_provider"
    }
}

/// 规则加载器提供器
#[async_trait]
pub trait RuleProvider: Send + Sync {
    async fn provide(
        &self,
        profile: &ProjectProfile,
    ) -> BootstrapResult<Arc<dyn RulesLoaderExt>>;

    fn name(&self) -> &'static str {
        "rule_provider"
    }
}

/// 数据源提供器
#[async_trait]
pub trait DataSourceProvider: Send + Sync {
    /// 在上下文中注册数据源/客户端等共享资源
    async fn configure(
        &self,
        profile: &ProjectProfile,
        ctx: &mut BootstrapContext,
    ) -> BootstrapResult<()>;

    fn name(&self) -> &'static str {
        "data_source_provider"
    }
}

/// 元数据提供器
#[async_trait]
pub trait MetadataProvider: Send + Sync {
    /// 返回本阶段需要补充的键值对
    async fn provide(
        &self,
        profile: &ProjectProfile,
    ) -> BootstrapResult<HashMap<String, String>>;

    fn name(&self) -> &'static str {
        "metadata_provider"
    }
}

/// 事件处理器提供器
///
/// 用于提供事件处理器，这些处理器会在运行时的特定事件发生时被调用。
///
/// # 使用场景
/// - 日志记录
/// - 性能监控
/// - 审计追踪
/// - 自定义业务逻辑触发
#[async_trait]
pub trait EventHandlerProvider: Send + Sync {
    /// 根据项目画像返回事件处理器列表
    async fn provide(
        &self,
        profile: &ProjectProfile,
    ) -> BootstrapResult<Vec<Arc<dyn EventHandler<Event> + Send + Sync>>>;

    fn name(&self) -> &'static str {
        "event_handler_provider"
    }
}

/// 中间件提供器
///
/// 用于提供中间件栈，中间件可以拦截和处理运行时的操作。
///
/// # 使用场景
/// - 请求/响应拦截
/// - 权限验证
/// - 数据转换
/// - 缓存处理
#[async_trait]
pub trait MiddlewareProvider: Send + Sync {
    /// 根据项目画像返回中间件栈
    async fn provide(
        &self,
        profile: &ProjectProfile,
    ) -> BootstrapResult<MiddlewareStack>;

    fn name(&self) -> &'static str {
        "middleware_provider"
    }
}

/// Forge 配置提供器
///
/// 用于提供 ForgeConfig 配置，包括：
/// - runtime_type: 运行时类型（Sync/Async/Actor）
/// - max_concurrent_tasks: 最大并发任务数
/// - queue_size: 队列大小
/// - enable_monitoring: 是否启用监控
/// - 其他性能配置
#[async_trait]
pub trait ForgeConfigProvider: Send + Sync {
    /// 根据项目画像返回 Forge 配置
    async fn provide(
        &self,
        profile: &ProjectProfile,
    ) -> BootstrapResult<ForgeConfig>;

    fn name(&self) -> &'static str {
        "forge_config_provider"
    }
}
